Hibernate Caching

Java Technologies - হাইবারনেট (Hibernate)
168
168

Hibernate Caching হল একটি কার্যকর কৌশল যা Hibernate ORM-এ পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়। Caching-এর মাধ্যমে ডেটাবেস থেকে বারবার ডেটা অনুসন্ধান করার প্রয়োজন কমিয়ে আনা হয়, যার ফলে অ্যাপ্লিকেশনের পারফরম্যান্স উল্লেখযোগ্যভাবে বৃদ্ধি পায়। Hibernate-এ caching ব্যবহারের মূল উদ্দেশ্য হল ডেটাবেসে থাকা ডেটার কপি সিস্টেমের মধ্যে সংরক্ষণ করা, যাতে পরবর্তীতে সেই ডেটা পাওয়ার জন্য নতুন করে ডেটাবেসে কোয়েরি না পাঠাতে হয়।

Hibernate Caching মূলত দুটি ভাগে বিভক্ত:

  1. First-Level Cache (Session Cache) – এটি session পর্যায়ে কাজ করে এবং Hibernate সেশনের মধ্যে সমস্ত ডেটার কপি সংরক্ষণ করে। এটি ডিফল্টভাবে সক্রিয় থাকে।
  2. Second-Level Cache (SessionFactory Cache) – এটি SessionFactory পর্যায়ে কাজ করে এবং অ্যাপ্লিকেশনের সবার জন্য ডেটার কপি রাখে।

এখানে, Hibernate Caching সম্পর্কে বিস্তারিত আলোচনা করা হবে এবং প্রথম এবং দ্বিতীয় লেভেল ক্যাশিং কিভাবে কাজ করে তা ব্যাখ্যা করা হবে।


1. First-Level Cache (Session Cache)

First-Level Cache Hibernate-এ ডিফল্টভাবে সক্ষম থাকে এবং এটি session পর্যায়ের ক্যাশিং। এর মানে হলো, একবার একটি অবজেক্ট সেশন থেকে রিট্রিভ করা হলে, এটি সেই সেশনের মধ্যে ক্যাশ হয়ে যায়। যখনই ওই অবজেক্টটি পরবর্তী সময়ে রিট্রিভ করা হয়, তখন এটি ক্যাশ থেকে পাওয়া যাবে এবং ডেটাবেসে গিয়ে নতুন করে অনুসন্ধান করতে হবে না।

First-Level Cache Example:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class FirstLevelCacheExample {
    public static void main(String[] args) {
        // Create session factory
        SessionFactory factory = new Configuration()
                                .configure("hibernate.cfg.xml")
                                .addAnnotatedClass(Student.class)
                                .buildSessionFactory();

        // Create session
        Session session = factory.getCurrentSession();

        try {
            // Start a transaction
            session.beginTransaction();

            // Retrieve a student object
            Student student1 = session.get(Student.class, 1); // First time DB hit

            // Retrieve the same student object again (No DB hit, fetched from cache)
            Student student2 = session.get(Student.class, 1); // Second time, from first-level cache

            // Display the student
            System.out.println(student1);
            System.out.println(student2);  // Same object as student1

            // Commit the transaction
            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

First-Level Cache এর মূল বৈশিষ্ট্য:

  • Session-এ সীমাবদ্ধ: ক্যাশটি শুধুমাত্র সেশনের মধ্যে সীমাবদ্ধ থাকে এবং একই সেশনে একাধিকবার একই অবজেক্ট রিট্রিভ করা হলে সেটি ক্যাশ থেকে পাওয়া যায়।
  • স্বয়ংক্রিয়ভাবে সক্ষম: First-level ক্যাশিং ডিফল্টভাবে সক্রিয় থাকে এবং কোনো অতিরিক্ত কনফিগারেশনের প্রয়োজন হয় না।
  • কোনো SQL কোয়েরি ছাড়া পুনরায় অবজেক্ট রিট্রিভ করা যায়: যদি একই অবজেক্টকে সেশনে আবার রিট্রিভ করা হয়, তাহলে এটি ক্যাশ থেকে পাওয়া যায়, ডেটাবেসে গিয়ে কোয়েরি পাঠাতে হয় না।

2. Second-Level Cache (SessionFactory Cache)

Second-Level Cache হল একটি অ্যাপ্লিকেশন-স্কোপড ক্যাশ যা SessionFactory পর্যায়ে কাজ করে। এই ক্যাশটি session এর বাইরে কাজ করে এবং একাধিক sessions এর মধ্যে ডেটা শেয়ার করে। এটি আপনাকে একই ডেটাবেস রেকর্ডকে একাধিক সেশনের মধ্যে পুনরায় রিট্রিভ করতে সাহায্য করে, যা অ্যাপ্লিকেশন পারফরম্যান্সে উন্নতি আনে।

Second-Level Cache Example:

Second-level cache সক্রিয় করতে আপনাকে Hibernate কনফিগারেশনে কিছু সেটিংস যুক্ত করতে হবে।

  1. hibernate.cfg.xml (Configuration File):
<hibernate-configuration>
    <session-factory>
        <!-- JDBC Database connection settings -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database_name</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">password</property>

        <!-- Second Level Cache -->
        <property name="hibernate.cache.provider_class">org.hibernate.cache.ehcache.EhCacheProvider</property>
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.use_query_cache">true</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="hibernate.show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hibernate.hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>
  1. Entity Class (Student): Hibernate ক্যাশিংয়ের জন্য আপনি আপনার Entity ক্লাসে @Cache অ্যানোটেশন ব্যবহার করবেন।
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  // Enable caching for this entity
public class Student {
    @Id
    private int id;
    private String name;
    private String course;

    // Getters and Setters
}
  1. Using the Second-Level Cache: এরপর, দ্বিতীয় লেভেল ক্যাশ ব্যবহার করে ডেটা ক্যাশ করা হয় এবং session এর বাইরে যখন সেই ডেটা রিট্রিভ করা হয়, তখন এটি ক্যাশ থেকে পাওয়া যাবে, ডেটাবেস থেকে নয়।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.cache.ehcache.internal.EhcacheRegionFactory;

public class SecondLevelCacheExample {
    public static void main(String[] args) {
        // Create session factory
        SessionFactory factory = new Configuration()
                                .configure("hibernate.cfg.xml")
                                .addAnnotatedClass(Student.class)
                                .buildSessionFactory();

        // Create session
        Session session = factory.getCurrentSession();

        try {
            session.beginTransaction();

            // Retrieve a student object (first query to DB)
            Student student1 = session.get(Student.class, 1);
            System.out.println(student1);

            // Second query to fetch the same student (from second-level cache)
            Student student2 = session.get(Student.class, 1);
            System.out.println(student2);  // The object is fetched from cache

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Second-Level Cache এর মূল বৈশিষ্ট্য:

  • SessionFactory-এ সীমাবদ্ধ: এটি একাধিক সেশন এর মধ্যে ডেটা শেয়ার করতে সাহায্য করে।
  • কনফিগারেশন প্রয়োজন: Second-level cache ব্যবহারের জন্য কিছু অতিরিক্ত কনফিগারেশন প্রয়োজন (যেমন: Ehcache বা অন্য কোনো ক্যাশিং প্রোভাইডার ব্যবহার করা)।
  • একাধিক সেশন ধরে ডেটা সংরক্ষণ: এটি একাধিক সেশনের মধ্যে পুনরায় ব্যবহৃত ডেটা ক্যাশ করে, যার ফলে একই ডেটা রিট্রিভ করতে ডেটাবেসে গিয়ে পুনরায় কোয়েরি করতে হয় না।

3. Query Cache in Hibernate

Hibernate এছাড়াও query cache প্রদান করে, যা কোয়েরির ফলাফল ক্যাশ করে, এবং পরবর্তীতে একই কোয়েরি চলালে সেগুলি ক্যাশ থেকে ফেরত পাওয়া যায়।

Query Cache Example:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;

import java.util.List;

public class QueryCacheExample {
    public static void main(String[] args) {
        // Create session factory
        SessionFactory factory = new Configuration()
                                .configure("hibernate.cfg.xml")
                                .addAnnotatedClass(Student.class)
                                .buildSessionFactory();

        // Create session
        Session session = factory.getCurrentSession();

        try {
            // Start a transaction
            session.beginTransaction();

            // Enable query cache
            session.enableFilter("student_filter");

            // Use cache to fetch students
            Query<Student> query = session.createQuery("from Student where course='Java'", Student.class);
            query.setCacheable(true);  // Enable query caching

            // Execute the query
            List<Student> students = query.getResultList();
            students.forEach(System.out::println);

            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

In this example:

  • setCacheable(true) enables the query cache for the query.
  • This caches the query result and returns it directly for subsequent executions.

4. Cache Providers

Hibernate supports several cache providers for second-level cache:

  • Ehcache: A widely used, open-source caching solution.
  • Infinispan: A powerful, distributed caching provider.
  • OSCache: A Java-based caching solution.
  • JBoss Cache: A distributed cache provided by JBoss.

You can configure any of these cache providers in the Hibernate configuration to enable second-level caching.


Hibernate Caching greatly improves application performance by reducing the number of database queries. The First-Level Cache is automatically enabled and works within the session scope, while the Second-Level Cache can be enabled and configured to work across multiple sessions. The Query Cache caches query results to improve performance for repeated queries. Proper use of caching in Hibernate can reduce load times, enhance scalability, and improve overall system performance.

Content added By

Caching এর ধারণা এবং প্রয়োজনীয়তা

110
110

Caching হল একটি performance optimization কৌশল, যা ডেটাবেস অ্যাপ্লিকেশনগুলিতে প্রাপ্ত ডেটার কপি সংরক্ষণ করে, যাতে ভবিষ্যতে সেই ডেটা দ্রুত অ্যাক্সেস করা যায়। Hibernate ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক ডেটাবেস অ্যাপ্লিকেশনগুলির পারফরম্যান্স বৃদ্ধি করার জন্য একটি শক্তিশালী কেচিং মেকানিজম প্রদান করে। Hibernate ক্যাশিং প্রযুক্তি Query Performance এবং Data Fetching Efficiency উন্নত করতে সাহায্য করে।

Hibernate কেচিং ডেটাবেসের মধ্যে পুনরায় একই ডেটা অ্যাক্সেস করার সময় ডেটা রিটার্ন করার জন্য শুধুমাত্র কেচে রাখা ডেটা ব্যবহার করে, যা ডেটাবেসের লোড কমায় এবং অ্যাপ্লিকেশনের কর্মক্ষমতা (performance) বৃদ্ধি করে।


Hibernate Caching এর দুটি স্তর (Two Levels of Caching)

Hibernate দুটি স্তরের ক্যাশিং সমর্থন করে:

  1. First Level Cache (Session Cache)
  2. Second Level Cache (SessionFactory Cache)

1. First Level Cache (Session Cache)

  • First Level Cache হল Hibernate এর ডিফল্ট ক্যাশিং স্তর, যা Session-এর সাথে সম্পর্কিত। যখন আপনি Hibernate Session ব্যবহার করেন, তখন প্রথমবার ডেটা লোড করা হলে এটি First Level Cache-এ সংরক্ষণ করা হয়। পরবর্তীভাবে যখন আপনি সেই ডেটা আবার অনুসন্ধান করবেন, তখন ডেটা সরাসরি ক্যাশ থেকে পাওয়া যাবে, ডেটাবেস থেকে নতুন করে রিটার্ন করা হবে না।
  • First Level Cache প্রতিটি Session এর জন্য আলাদা এবং Session বন্ধ হলে এটি মুছে যায়। এর ফলে এটি শুধুমাত্র একটি ট্রানজেকশনের মধ্যে ডেটা ক্যাশ করে রাখে।

First Level Cache ব্যবহারের উদাহরণ:

Session session = sessionFactory.openSession();
session.beginTransaction();

// First time data fetch, Hibernate loads data from the database
User user = session.get(User.class, 1);

// Second time data fetch, Hibernate retrieves data from first level cache (no database hit)
User cachedUser = session.get(User.class, 1);

session.getTransaction().commit();
session.close();

এখানে, First Level Cache প্রথমবার User অবজেক্ট ডেটাবেস থেকে লোড করার পরে সেটি ক্যাশে সংরক্ষণ করে। পরবর্তীভাবে যখন একই অবজেক্ট আবার অনুসন্ধান করা হয়, তখন এটি ক্যাশ থেকে সরাসরি ফিরিয়ে দেয়।

2. Second Level Cache (SessionFactory Cache)

Second Level Cache হল একটি SessionFactory-এর সাথে সম্পর্কিত ক্যাশিং স্তর। এটি Session এর সীমাবদ্ধতা থেকে বাইরে কাজ করে এবং সমস্ত Session এর মধ্যে শেয়ার করা হয়। Second Level Cache মূলত SessionFactory লেভেল সিঙ্গেল ক্যাশে হিসাব করা যায় এবং এটি একটি global cache হিসেবে কাজ করে।

  • Second Level Cache Entity, Collections, এবং Query ক্যাশিংয়ের জন্য ব্যবহার করা হয়।
  • এটি Session বন্ধ হলেও ক্যাশে ডেটা রাখতে সক্ষম হয় এবং ডেটা পুনরায় পাওয়া যায়।
  • Second Level Cache হাইবারনেটের কনফিগারেশন ফাইলের মাধ্যমে সক্ষম করা হয় এবং ক্যাশিং সিস্টেম যেমন EHCache, Infinispan ইত্যাদি ব্যবহার করা যায়।

Second Level Cache ব্যবহারের উদাহরণ:

Session session = sessionFactory.openSession();
session.beginTransaction();

// First time data fetch, data will be loaded from the database
User user = session.get(User.class, 1);

// Second time data fetch, data will be retrieved from second level cache
User cachedUser = session.get(User.class, 1);

session.getTransaction().commit();
session.close();

এখানে, যখন প্রথমবার User অবজেক্ট ডেটাবেস থেকে লোড করা হয়, তখন এটি Second Level Cache-এ সংরক্ষণ করা হয়। পরবর্তী Session এ যখন আবার একই অবজেক্টে অ্যাক্সেস করা হয়, তখন তা Second Level Cache থেকে পাওয়া যায় এবং ডেটাবেসে কোনো নতুন কুয়েরি চলে না।


Hibernate Caching এর প্রয়োজনীয়তা

Hibernate ক্যাশিং ব্যবহারের প্রধান উদ্দেশ্য হল ডেটাবেসের প্রতি চাপ কমানো এবং অ্যাপ্লিকেশন পারফরম্যান্স বৃদ্ধি করা। কিছু গুরুত্বপূর্ণ সুবিধা নিচে দেওয়া হল:

  1. Performance Improvement:
    • Hibernate ক্যাশিং ডেটাবেসের উপর লোড কমায় এবং একই ডেটা পুনরায় ডেটাবেস থেকে না এনে ক্যাশ থেকে সরাসরি অ্যাক্সেস করে। এর ফলে, ডেটাবেস কুয়েরি সংখ্যা কমে এবং অ্যাপ্লিকেশন পারফরম্যান্স উন্নত হয়।
  2. Reduced Database Load:
    • ক্যাশিং ডেটাবেসে বারবার একে অপরকে অনুসন্ধান করার প্রয়োজনীয়তা কমিয়ে আনে। এটি ডেটাবেসের লোড কমায়, বিশেষ করে যখন একই ডেটা একাধিকবার অ্যাক্সেস করা হয়।
  3. Faster Data Retrieval:
    • ক্যাশে ডেটা সংরক্ষণ করলে, ডেটা দ্রুত পাওয়া যায়, কারণ ডেটাবেস থেকে পুনরায় রিটার্ন করতে সময় লাগে। ক্যাশিং অ্যাক্সেসের জন্য ডেটা সরাসরি মেমোরি থেকে পাওয়া যায়, যা দ্রুততর।
  4. Global Cache for Multiple Sessions:
    • Second Level Cache ব্যবহার করে আপনি একাধিক Session-এর মধ্যে শেয়ার করা ডেটা ক্যাশে রাখতে পারেন, যা অ্যাপ্লিকেশনটি বড় হলে অনেক বেশি কার্যকরী হয়।
  5. Efficient Resource Usage:
    • ক্যাশিং ডেটাবেসের সঙ্গে বারবার যোগাযোগের প্রয়োজনীয়তা কমায়, এবং সিস্টেমের রিসোর্স যেমন নেটওয়ার্ক এবং ডেটাবেস কানেকশনগুলো সাশ্রয় হয়।

Hibernate Caching এর কনফিগারেশন

Hibernate ক্যাশিং সিস্টেম ব্যবহারের জন্য আপনাকে কিছু কনফিগারেশন করতে হবে, যেমন hibernate.cfg.xml ফাইলে ক্যাশিং ব্যবস্থাকে সক্রিয় করা। Hibernate সাধারণত EHCache অথবা Infinispan ক্যাশিং সিস্টেমের সাথে কাজ করে।

Hibernate Caching কনফিগারেশন উদাহরণ:

<hibernate-configuration>
    <session-factory>
        <!-- Enable Second-Level Cache -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        
        <!-- Cache Provider -->
        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
        
        <!-- Enable Query Cache -->
        <property name="hibernate.cache.use_query_cache">true</property>
        
        <!-- Cache region factory -->
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
    </session-factory>
</hibernate-configuration>

এখানে:

  • hibernate.cache.use_second_level_cache ক্যাশিং সক্ষম করে।
  • hibernate.cache.provider_class ক্যাশ প্রোভাইডার (এখানে EhCache ব্যবহার করা হয়েছে) নির্দেশ করে।
  • hibernate.cache.use_query_cache ক্যাশে queries সংরক্ষণের জন্য সঠিক কনফিগারেশন।

Hibernate ক্যাশিং ব্যবহারের মাধ্যমে আপনি performance improvement, reduced database load, এবং faster data retrieval পেতে পারেন। First Level Cache ডিফল্টভাবে Session এর জন্য কাজ করে, এবং Second Level Cache SessionFactory এর জন্য কার্যকরী থাকে। Hibernate ক্যাশিং ডেটাবেসের সাথে ইন্টারঅ্যাকশনকে আরও কার্যকরী এবং দ্রুত করে তোলে, বিশেষ করে যখন অ্যাপ্লিকেশন বড় এবং ডেটার পুনরায় অ্যাক্সেস করা হয়। Hibernate ক্যাশিং কনফিগারেশন সহজ এবং এটি পারফরম্যান্সের ক্ষেত্রে বড় সাহায্য প্রদান করে।

Content added By

First Level Cache (Session Cache)

179
179

Hibernate এ First-Level Cache (Session Cache) হল একটি session scope এর মধ্যে কাজ করা ক্যাশিং মেকানিজম। এটি Hibernate-এর default cache এবং এটি Hibernate session-এর জন্য স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়। First-level cache Hibernate সেশনের সাথে সম্পর্কিত এবং এটি session object এর মধ্যে ডেটা স্টোর করে রাখে। এটি ডেটাবেস থেকে ডেটা পুনরায় লোড না করে, ক্যাশে থেকে ডেটা সরবরাহ করে, ফলে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি পায়।

First-Level Cache এর বৈশিষ্ট্য:

  1. Session Scope:
    First-level cache শুধুমাত্র Hibernate session এর মধ্যে কার্যকরী। একবার যখন একটি session বন্ধ হয়ে যায়, তখন ক্যাশে পরিষ্কার হয়ে যায়। এতে session এর মধ্যে যে অবজেক্টগুলো লোড হয়, সেগুলো ক্যাশে রাখা হয় এবং পরবর্তী ব্যবহারিত ক্ষেত্রগুলো থেকে ডেটা পাওয়া যায়।
  2. Automatic Caching:
    Hibernate এর first-level cache স্বয়ংক্রিয়ভাবে সক্রিয় থাকে এবং এতে কোন কনফিগারেশন বা সেটআপ করার প্রয়োজন হয় না। যতক্ষণ না সেশনটি শেষ হয়, ততক্ষণ এটি কাজ করে।
  3. No Duplicate Queries:
    First-level cache ক্যাশে থাকা অবজেক্টের জন্য একই কুয়েরি পুনরায় চালানো থেকে বিরত থাকে। যদি একই অবজেক্ট পরবর্তীতে অ্যাক্সেস করা হয়, তবে এটি ডেটাবেস থেকে ফেরত না এসে ক্যাশে থেকে সরবরাহ করা হয়।
  4. Data Retrieval from Cache:
    যখন আপনি get() বা load() মেথডের মাধ্যমে একটি অবজেক্ট রিট্রিভ করেন, Hibernate প্রথমে first-level cache চেক করে এবং অবজেক্টটি ক্যাশে থাকলে তা সরাসরি রিটার্ন করে।

First-Level Cache কাজ করার প্রক্রিয়া

  1. Session Open:
    যখন আপনি Hibernate এর session খুলবেন, তখন হাইবারনেট একটি ক্যাশ তৈরি করে যা শুধুমাত্র ঐ session এর জন্য প্রযোজ্য।
  2. Object Retrieval:
    যখন আপনি একটি entity অবজেক্ট রিট্রিভ করবেন, Hibernate প্রথমে সেই অবজেক্টটি first-level cache এ খুঁজে দেখে। যদি এটি সেখানে পাওয়া যায়, তবে এটি ডেটাবেসে কুয়েরি না করে সরাসরি ক্যাশ থেকে ডেটা ফেরত দেয়।
  3. Object Persistence:
    আপনি যখন একটি অবজেক্ট তৈরি বা আপডেট করবেন, Hibernate সেটি first-level cache এ রাখবে এবং session.commit() হওয়ার পর ডেটাবেসে প্রযোজ্য পরিবর্তনগুলি প্রেরণ করবে।
  4. Session Close:
    একবার session বন্ধ হলে, first-level cache মুছে ফেলা হয়। এর মানে হল যে এই ক্যাশে রাখা ডেটা session এর মধ্যে শেষ হয়, এবং session পুনরায় শুরু হলে নতুন ক্যাশ শুরু হয়।

First-Level Cache এর উদাহরণ

এখানে আমরা একটি উদাহরণ দেখব যেখানে first-level cache ব্যবহৃত হচ্ছে। উদাহরণে, আমরা Employee entity এর একটি instance তৈরি করব এবং প্রথমবার ডেটাবেস থেকে রিট্রিভ করার পর ক্যাশে কীভাবে তা সংরক্ষিত হচ্ছে তা দেখব।

Employee.java (Entity Class)

import javax.persistence.*;

@Entity
@Table(name="employee")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="salary")
    private double salary;

    // Constructors, Getters and Setters
    public Employee() {}

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

Hibernate Session এবং First-Level Cache Example

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

public class FirstLevelCacheExample {
    public static void main(String[] args) {

        // SessionFactory তৈরি করা
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
                .addAnnotatedClass(Employee.class)
                .buildSessionFactory();

        // Session তৈরি করা
        Session session = factory.getCurrentSession();

        try {
            // 1st Query - Employee object get করা (First-level cache এর মধ্যে সংরক্ষিত)
            session.beginTransaction();
            Employee employee1 = session.get(Employee.class, 1);  // First query, will hit DB
            System.out.println("Employee Retrieved: " + employee1.getName());

            // 2nd Query - একই Employee object আবার get করা (First-level cache থেকে ফিরে আসবে)
            Employee employee2 = session.get(Employee.class, 1);  // Second query, will use the cache
            System.out.println("Employee Retrieved Again: " + employee2.getName());

            // Check if both references are pointing to the same object in memory
            System.out.println("Are both references the same? " + (employee1 == employee2));

            session.getTransaction().commit();

        } finally {
            factory.close();
        }
    }
}

Output:

Employee Retrieved: John Doe
Employee Retrieved Again: John Doe
Are both references the same? true

এখানে:

  • প্রথমবার employee1 রিট্রিভ করা হলে, Hibernate ডেটাবেস থেকে ডেটা আনে।
  • দ্বিতীয়বার employee2 রিট্রিভ করা হলে, Hibernate ডেটাবেসে কুয়েরি না করে first-level cache থেকে ডেটা ফেরত দেয়।
  • employee1 এবং employee2 একই অবজেক্টের রেফারেন্স, তাই employee1 == employee2 সত্য হয়।

First-Level Cache এর সুবিধা

ফিচারবিবরণ
Performance ImprovementFirst-level cache ডেটাবেসের প্রতি কুয়েরি সংখ্যা কমিয়ে পারফরম্যান্স উন্নত করে।
Avoid Duplicate Queriesএকবার ডেটা লোড হলে, এটি প্রথম সেশনে পুনরায় লোড করা হয় না।
Automatic and TransparentFirst-level cache স্বয়ংক্রিয়ভাবে কার্যকর হয় এবং ডেভেলপারদের কাছে কিছু কনফিগারেশন প্রয়োজন হয় না।
Session-Specific Cacheএটি সেশনের মধ্যে একটি ডেটা পয়েন্টের জন্য নিশ্চিত করে যে ডুপ্লিকেট কুয়েরি না হয়।

First-Level Cache এর চ্যালেঞ্জ

  1. Memory Usage:
    যেহেতু সমস্ত অবজেক্ট সেশন শেষ না হওয়া পর্যন্ত ক্যাশে থাকে, বড় ডেটা সেটে অনেক বেশি মেমরি ব্যবহার হতে পারে।
  2. No Cross-Session Caching:
    First-level cache শুধুমাত্র একটি সেশনের মধ্যে কাজ করে, তাই অন্য সেশনে একই ডেটা রিটার্ন করার জন্য পুনরায় ডেটাবেস কুয়েরি চালাতে হয়।
  3. Caching Beyond Session Scope:
    দীর্ঘ সময় ধরে অবজেক্টগুলো ক্যাশে থাকতে পারে না। যদি আপনি cross-session caching চান তবে Hibernate Second-Level Cache ব্যবহার করা উচিত।

Hibernate এর First-Level Cache (Session Cache) হল একটি শক্তিশালী এবং প্রয়োজনীয় ফিচার যা session scope এর মধ্যে অবজেক্টগুলিকে ক্যাশে রাখে এবং পুনরায় ডেটাবেস কুয়েরি না করে ডেটা সরবরাহ করে। এটি performance বৃদ্ধি করতে সাহায্য করে এবং duplicate queries কমায়। তবে, cross-session ক্যাশিংয়ের জন্য Hibernate-এর Second-Level Cache ব্যবহার করা উচিত।

Content added By

Second Level Cache (EHCache, OSCache)

160
160

Hibernate একটি Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা ডেটাবেসের সঙ্গে Java objects এর ইন্টারঅ্যাকশন সহজ করে। Hibernate বিভিন্ন ধরণের ক্যাশিং মেকানিজম সাপোর্ট করে, যার মধ্যে Second Level Cache খুবই গুরুত্বপূর্ণ। Second Level Cache হল একটি ক্যাশ স্তর যা SessionFactory এর উপর ভিত্তি করে কাজ করে এবং এটি Hibernate ক্যাশিং পদ্ধতির মধ্যে একটি অতিরিক্ত স্তর সরবরাহ করে।

Second Level Cache: ধারণা

  • First Level Cache: Hibernate এর প্রথম স্তরের ক্যাশ যা Session অবজেক্টে থাকে এবং এটি session-per-request প্যাটার্নে কাজ করে। একটি সেশন বন্ধ হওয়ার পর, ক্যাশের ডেটা ফ্রি হয়ে যায়।
  • Second Level Cache: এটি SessionFactory-এর সাথে সম্পর্কিত একটি ক্যাশ, যা sessions এর মধ্যে শেয়ার করা হয় এবং ডেটাবেসে একাধিক কল থেকে প্রাপ্ত ডেটা ক্যাশ করে রাখতে সহায়তা করে।

Second Level Cache মূলত ডেটাবেস থেকে বারবার ডেটা পুনরুদ্ধার করার পরিবর্তে ডেটার একটি কপি ক্যাশে রেখে ব্যবহৃত হয়, যা অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সাহায্য করে।


Second Level Cache ব্যবহারের সুবিধা:

  1. Performance Improvement:
    • Second Level Cache, ডেটাবেস থেকে একাধিক বার একই ডেটা রিকুয়েস্ট করার পরিবর্তে ক্যাশে সঞ্চিত ডেটা সরবরাহ করে, যার ফলে ডেটাবেস লোড কমে এবং পারফরম্যান্স বৃদ্ধি পায়।
  2. Reduced Database Access:
    • যখন ডেটা ক্যাশে থাকে, তখন একই ডেটা বারবার ডেটাবেসে রিকুয়েস্ট করার দরকার হয় না, যা ডেটাবেসের উপর চাপ কমায়।
  3. Data Sharing Between Sessions:
    • Second Level Cache এর মাধ্যমে একাধিক সেশনের মধ্যে ডেটা শেয়ার করা যায়, যা অ্যাপ্লিকেশন জুড়ে ডেটা অ্যাক্সেসের সঠিকতা এবং দক্ষতা বাড়ায়।

Second Level Cache এর জন্য Popular Implementations

Hibernate দুইটি জনপ্রিয় ক্যাশিং প্রোভাইডার সাপোর্ট করে:

  1. EHCache
  2. OSCache

এই ক্যাশিং টুলস Hibernate এর Second Level Cache এর জন্য ব্যবহৃত হয়।


1. EHCache

EHCache একটি ওপেন সোর্স ক্যাশিং লাইব্রেরি যা second level cache হিসাবে খুবই জনপ্রিয় এবং Hibernate এর সাথে সহজে ইন্টিগ্রেট করা যায়। এটি Java এর জন্য একটি শক্তিশালী ক্যাশিং সিস্টেম সরবরাহ করে, এবং এটি ডেটা ক্যাশিং, object caching, query caching, এবং distributed caching এর জন্য ব্যবহৃত হয়।

EHCache Configuration:

  1. Maven Dependency:
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>5.4.32.Final</version> <!-- Or the latest version -->
</dependency>

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.10.0</version> <!-- Or the latest version -->
</dependency>
  1. hibernate.cfg.xml Configuration:
<hibernate-configuration>
    <session-factory>
        <!-- Enable second level cache -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class">
            org.hibernate.cache.ehcache.EhCacheRegionFactory
        </property>
        <property name="hibernate.cache.provider_configuration_file_resource_path">
            /ehcache.xml
        </property>
        <property name="hibernate.cache.use_query_cache">true</property>
    </session-factory>
</hibernate-configuration>
  1. ehcache.xml Configuration:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://ehcache.org/ehcache.xsd
             http://ehcache.org/schema/ehcache http://ehcache.org/schema/ehcache.xsd"
         xmlns="http://ehcache.org/schema/ehcache">

    <cache name="com.example.MyEntity"
           maxEntriesLocalHeap="1000"
           eternal="false"
           timeToIdleSeconds="600"
           timeToLiveSeconds="1200"
           overflowToDisk="false"
           statistics="true">
    </cache>
</ehcache>

ব্যাখ্যা:

  • Hibernate এর মধ্যে hibernate.cache.region.factory_class সেটিংয়ে EHCache এর জন্য EhCacheRegionFactory নির্ধারণ করা হয়েছে।
  • EHCache ক্যাশ কনফিগারেশন ehcache.xml ফাইলে নির্ধারিত হয়েছে যেখানে ডেটা ক্যাশিং সম্পর্কিত সেটিংস যেমন maximum entries, expiry time ইত্যাদি কনফিগার করা হয়েছে।

2. OSCache

OSCache একটি open-source ক্যাশিং লাইব্রেরি যা Hibernate এর second level cache হিসাবে ব্যবহৃত হতে পারে। এটি হাই- পারফরম্যান্স ক্যাশিং সমাধান সরবরাহ করে এবং in-memory এবং disk-based ক্যাশিং উভয় সাপোর্ট করে।

OSCache Configuration:

  1. Maven Dependency:
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-oscache</artifactId>
    <version>3.2.6.ga</version> <!-- Or the latest version -->
</dependency>

<dependency>
    <groupId>net.sf.oscache</groupId>
    <artifactId>oscache</artifactId>
    <version>2.4.1</version> <!-- Or the latest version -->
</dependency>
  1. hibernate.cfg.xml Configuration:
<hibernate-configuration>
    <session-factory>
        <!-- Enable second level cache -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.region.factory_class">
            org.hibernate.cache.oscache.OSCacheProvider
        </property>
        <property name="hibernate.cache.use_query_cache">true</property>
    </session-factory>
</hibernate-configuration>
  1. OSCache Configuration:
<cache>
    <name>com.example.MyEntity</name>
    <maxElementsInMemory>1000</maxElementsInMemory>
    <eternal>false</eternal>
    <timeToLive>600</timeToLive>
    <timeToIdle>300</timeToIdle>
</cache>

ব্যাখ্যা:

  • OSCache এর জন্য ক্যাশ কনফিগারেশন XML ফাইলে নির্ধারিত হয়। এটি টেবিল বা ক্লাসের উপর নির্ভর করে maxElementsInMemory, timeToLive, timeToIdle ইত্যাদি কনফিগারেশন সেট করতে পারে।
  • hibernate.cache.region.factory_classOSCacheProvider ব্যবহৃত হয়েছে।

Third-party Libraries Comparison: EHCache vs OSCache

FeatureEHCacheOSCache
PerformanceHigh performance, especially for large-scale applications.Good for general use but less efficient for large-scale apps.
Ease of UseEasy to integrate and configure with Hibernate.Requires some setup and may need more maintenance.
Memory ManagementSupports in-memory and disk-based storage, fine-tuned eviction policies.Primarily in-memory with basic eviction policies.
Distributed CachingSupports distributed caching and replication (via Terracotta integration).Limited support for distributed caching.
MaturityWidely adopted, actively maintained.Older, less actively maintained.
IntegrationSeamless with Hibernate and popular frameworks.Can be used with Hibernate but requires more configuration.

Hibernate Second Level Cache এর মাধ্যমে ডেটাবেস অ্যাক্সেস অপটিমাইজ করা হয় এবং ডেটাবেসের উপর চাপ কমানো হয়। EHCache এবং OSCache দুটি জনপ্রিয় ক্যাশিং প্রোভাইডার যা Hibernate এর সেকেন্ড লেভেল ক্যাশের জন্য ব্যবহৃত হয়। EHCache একটি শক্তিশালী এবং কার্যকরী ক্যাশিং সিস্টেম সরবরাহ করে, এবং এটি distributed caching এর জন্য এক্সটেনশন সরবরাহ করে, যা বড় আর্কিটেকচারগুলির জন্য উপযুক্ত। অন্যদিকে, OSCache সিম্পল ক্যাশিং সমাধান সরবরাহ করে, কিন্তু এতে distributed caching এর সমর্থন কম।

অতএব, আপনার প্রয়োজনের উপর নির্ভর করে আপনি EHCache বা OSCache এর মধ্যে যেকোনো একটি ক্যাশিং সিস্টেম নির্বাচন করতে পারেন।

Content added By

Query Cache এবং Hibernate এর Caching Strategy

135
135

Hibernate একটি জনপ্রিয় Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা ডেটাবেসের সাথে যোগাযোগের জন্য caching mechanisms সরবরাহ করে। Query Cache এবং Hibernate Caching Strategy ডেটাবেসের পারফরম্যান্স বৃদ্ধি করতে এবং ডেটাবেস থেকে বারবার একই ডেটা পুনরুদ্ধার করার সময় কম লোড তৈরি করতে সহায়ক। Hibernate বিভিন্ন স্তরের ক্যাশিং (caching) সাপোর্ট করে, যা ডেটাবেসের পারফরম্যান্সে যথেষ্ট উন্নতি করতে পারে।

1. Hibernate Caching Overview

Hibernate-এর ক্যাশিং two levels এ কাজ করে:

  1. First-level cache (Session Cache):
    • Session-level cache একটি automatic cache যা Hibernate Session এর মাধ্যমে পরিচালিত হয়। যখন একটি Session তৈরি করা হয়, তখন এটি সেই session এর জন্য ডেটা ক্যাশ করে রাখে।
    • এটি enabled থাকে এবং manual configuration প্রয়োজন হয় না।
    • First-level cache ব্যবহৃত হয় যখন একটি Session এর মধ্যে কোনো ডেটা খোঁজা হয়। একবার একটি entity ফেচ করা হলে, পরবর্তী খোঁজগুলির জন্য এটি একই Session এর মধ্যে ক্যাশ থেকে সরবরাহ করা হয়।
  2. Second-level cache (SessionFactory Cache):
    • SessionFactory-level cache হল একটি shared cache যা Hibernate SessionFactory এর মাধ্যমে ব্যবস্থাপিত হয়। এটি ডেটাবেসের আউটসাইডে ডেটা সংরক্ষণ করে, তাই একাধিক সেশন থেকে অ্যাক্সেস করা যায়।
    • Second-level cache সাধারণত external caching providers (যেমন Ehcache, Infinispan, OSCache) এর সাথে কাজ করে। এই ক্যাশটি টেবিল বা entity এর জন্য ব্যবহৃত হয় এবং এটি manual configuration এর মাধ্যমে সক্রিয় করা হয়।
  3. Query Cache:
    • Query Cache একটি second-level cache এর অধীনে কাজ করে, যা SQL queries এর জন্য ব্যবহৃত হয়। এটি ক্যাশে query result sets সংরক্ষণ করে, যাতে একটি নির্দিষ্ট query একাধিক বার রান না করতে হয়।
    • Query cache ডেটাবেসে ফেচ করা ফলাফলগুলি ক্যাশ করে রাখে, এবং যখন একই query আবার চালানো হয়, তখন ডেটাবেস থেকে পুনরুদ্ধারের পরিবর্তে ক্যাশ থেকে ফলাফল পাওয়া যায়।

2. Hibernate Caching Strategy

Hibernate এর caching strategy ডেটার সঠিক অ্যাক্সেস এবং সংশ্লেষণের জন্য বিভিন্ন স্তরের ক্যাশিং ব্যবহার করে। Hibernate এ কিছু ক্যাশিং স্ট্র্যাটেজি আছে:

First-level Cache (Session Cache):

  • Automatic: Hibernate দ্বারা তৈরি Session এ এই ক্যাশটি নিজে থেকেই সক্রিয় থাকে।
  • Scope: একটি Session এর মধ্যে এর প্রভাব সীমাবদ্ধ থাকে।
  • Usage: Session এর মধ্যে যে কোনো entity বা object প্রথমবার ফেচ করা হলে সেটি ক্যাশে রাখা হয় এবং পরবর্তী ফেচের জন্য ডেটাবেসে আবার যেতে হয় না।

Second-level Cache:

  • Manual Configuration: দ্বিতীয় স্তরের ক্যাশ সক্রিয় করতে Hibernate এর configuration ফাইলে সেটিংস করতে হয়।
  • Cache Providers: Hibernate এর সাথে কিছু জনপ্রিয় cache providers ব্যবহার করা যেতে পারে যেমন Ehcache, Infinispan এবং OSCache
  • Usage: এই ক্যাশটি বিভিন্ন session এর মধ্যে শেয়ার করা যায় এবং একাধিক session থেকে পুনরায় ব্যবহৃত হতে পারে।

Query Cache:

  • Works with Second-Level Cache: Query Cache মূলত second-level cache এর মধ্যে একটি অংশ এবং এটি query results ক্যাশ করে।
  • Manual Configuration: Query cache ব্যবহারের জন্য এটি সক্রিয় করতে হবে এবং কিছু query এর জন্য ক্যাশিং সক্ষম করা হয়।

3. Query Cache Configuration and Usage in Hibernate

Hibernate এ Query Cache ব্যবহারের জন্য আপনাকে কিছু সেটিংস কনফিগার করতে হবে এবং কিছু নির্দিষ্ট queries ক্যাশে রাখতে হবে।

Step 1: Enable Second-Level Cache and Query Cache

প্রথমে, Hibernate configuration ফাইলে second-level cache এবং query cache সক্রিয় করতে হবে। নিচে এর একটি উদাহরণ দেওয়া হল।

<hibernate-configuration>
    <session-factory>
        <!-- Enable second-level cache -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        
        <!-- Enable query cache -->
        <property name="hibernate.cache.use_query_cache">true</property>
        
        <!-- Set cache provider (Ehcache example) -->
        <property name="hibernate.cache.region.factory_class">
            org.hibernate.cache.ehcache.EhCacheRegionFactory
        </property>
        
        <!-- Cache settings for Ehcache -->
        <property name="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</property>
    </session-factory>
</hibernate-configuration>

এখানে, hibernate.cache.use_query_cache প্রপার্টি true সেট করা হয়েছে, যাতে query cache সক্রিয় হয়।


Step 2: Enable Query Cache for Specific Queries

আপনি নির্দিষ্ট HQL (Hibernate Query Language) বা Criteria API queries এর জন্য ক্যাশিং সক্রিয় করতে পারেন।

Example: Query Cache with HQL:

import org.hibernate.Session;
import org.hibernate.query.Query;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateApp {
    public static void main(String[] args) {
        // Create SessionFactory
        SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
        Session session = factory.getCurrentSession();

        try {
            // Begin transaction
            session.beginTransaction();

            // Create HQL query
            Query<Employee> query = session.createQuery("from Employee where department = :department", Employee.class);
            query.setParameter("department", "IT");

            // Enable query cache
            query.setCacheable(true);

            // Execute the query and get results from cache or database
            List<Employee> employees = query.getResultList();

            for (Employee emp : employees) {
                System.out.println(emp.getName());
            }

            // Commit transaction
            session.getTransaction().commit();
        } finally {
            factory.close();
        }
    }
}

Explanation:

  • query.setCacheable(true): এটি query cache কে সক্ষম করে, এবং query result যদি ক্যাশে থাকে, তবে এটি ডেটাবেস থেকে পুনরুদ্ধারের পরিবর্তে ক্যাশ থেকে সরবরাহ করা হবে।

4. Hibernate Caching Providers

Hibernate বিভিন্ন caching providers ব্যবহার করে second-level cache এবং query cache এর কার্যকারিতা বৃদ্ধি করতে পারে। কিছু জনপ্রিয় cache providers হল:

  1. Ehcache:
    • এটি সবচেয়ে জনপ্রিয় এবং open-source cache provider। Hibernate এর সাথে একত্রে ব্যবহার করা সহজ।
  2. Infinispan:
    • এটি একটি distributed caching solution যা transactional এবং non-transactional cache হিসেবে ব্যবহার করা যেতে পারে।
  3. OSCache:
    • এটি একটি lightweight cache provider যা Java applications এর জন্য ব্যবহৃত হয়।

5. Advantages of Query Cache in Hibernate

  • Performance Boost: একাধিক বার একই query চালানোর সময়, ক্যাশ থেকে ডেটা পুনরুদ্ধার করা হয়, যা ডেটাবেসে বারবার কল করার পরিবর্তে পারফরম্যান্স বৃদ্ধি করতে সাহায্য করে।
  • Reduction in Database Load: ক্যাশে থাকা ফলাফলগুলি ব্যবহৃত হলে, ডেটাবেসে নতুন করে তথ্য চাওয়ার প্রয়োজন নেই, যা ডেটাবেস সার্ভারের লোড কমিয়ে দেয়।
  • Efficient Use of Resources: কম পুনরাবৃত্তি database queries এর মাধ্যমে resources ব্যবহারের দক্ষতা বাড়ায়।

  • Query Cache এবং Hibernate Caching Strategies Hibernate-এ পারফরম্যান্স উন্নত করার জন্য অত্যন্ত গুরুত্বপূর্ণ। Second-level cache এবং query cache ব্যবহার করলে ডেটাবেসের লোড কমানো যায় এবং একই query results বারবার ডেটাবেস থেকে পুনরুদ্ধার করা থেকে বিরত থাকা যায়।
  • Hibernate ক্যাশিংয়ের মাধ্যমে Ehcache, Infinispan এবং OSCache সহ বিভিন্ন cache providers ব্যবহার করা যেতে পারে, যা Hibernate এর কার্যকারিতা এবং স্কেলেবিলিটি উন্নত করে।

Query Cache এবং second-level cache এর মাধ্যমে Hibernate আপনাকে ডেটাবেসের কাজের গতি উন্নত করতে সহায়ক ফিচার প্রদান করে, বিশেষ করে যখন আপনার অ্যাপ্লিকেশন ডেটাবেসে প্রচুর read-heavy operations সম্পাদন করে।

Content added By
Promotion